home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / graph / _g_update.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  4.0 KB  |  194 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  _g_update.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #include <LEDA/graph.h>
  17.  
  18.  
  19. list<edge> graph::insert_reverse_edges()
  20. { list<edge> L;
  21.   edge e = first_edge();
  22.  
  23.   if (e != nil)
  24.   { L.append(new_edge(e->t,e->s,e->data[0]));
  25.     copy_edge_entry(e->data[0]);
  26.     e = succ_edge(e);
  27.    }
  28.  
  29.   edge stop = last_edge();
  30.  
  31.   while (e != stop);
  32.   { L.append(new_edge(e->t,e->s,e->data[0]));
  33.     copy_edge_entry(e->data[0]);
  34.     e = succ_edge(e);
  35.    } 
  36.  
  37.   return L;
  38. }
  39.  
  40.  
  41. void graph::reset()  const   // reset all iterators
  42. { node v;
  43.   forall_nodes(v,*this) v->adj_iterator=nil;
  44. }
  45.  
  46. node graph::new_node(GenPtr i)
  47.   node v = new node_struct(i); 
  48.   v->g = this;
  49.   v->name = ++max_n_index;
  50.   aux_link(v)->succ_link = nil;
  51.   V.append(node_link(v));
  52.   return v;
  53. }
  54.  
  55. void graph::del_node(node v)
  56. { if (v->g != this) error_handler(4,"del_node: v is not in G");
  57.  
  58.  
  59.   // delete adjacent edges
  60.   while (outdeg(v) != 0) del_edge(first_adj_edge(v));
  61.   while (indeg(v) != 0) del_edge(first_in_edge(v));
  62.  
  63.  
  64.   V.del(node_link(v));
  65.  
  66.   if (parent==0)   // no subgraph
  67.     clear_node_entry(v->data[0]);
  68.  
  69.   delete v;
  70. }
  71.  
  72. edge graph::new_edge(node v, node w, GenPtr i)
  73. { if ((v->g!=this) || (w->g!=this)) 
  74.       error_handler(6, "G.new_edge(v,w): v or w not in G");
  75.   edge e = new edge_struct(v,w,i);
  76.   e->name = ++max_e_index;
  77.   E.append(edge_link(e));
  78.   v->adj_edges[0].append(adj_link1(e));
  79.   w->adj_edges[1].append(adj_link2(e));
  80.   return e ; 
  81. }
  82.  
  83. edge graph::new_edge(edge e1, node w, GenPtr i, int dir)  
  84. { //add edge (source(e1),w) after/before e1 to adjacency list of source(e1)
  85.  
  86.   node v  = e1->s;
  87.  
  88.   if ((v->g!=this) || (w->g!=this)) 
  89.      error_handler(9,"G.new_edge(e,w): e or w not in G");
  90.  
  91.   edge e = new edge_struct(v,w,i);
  92.  
  93.   e->name = ++max_e_index;
  94.   E.append(edge_link(e));
  95.   v->adj_edges[0].insert(adj_link1(e),adj_link1(e1),dir);
  96.   w->adj_edges[1].append(adj_link2(e));
  97.   return e ; 
  98. }
  99.  
  100. edge graph::new_edge(edge e1, edge e2, GenPtr i, int dir1, int dir2)  
  101. { //add edge (source(e1),target(e2)) 
  102.   //after(dir=0)/before(dir=1) e1 to out-list of source(e1)
  103.   //after(dir=1)/before(dir=1) e2 to in-list of target(e2)
  104.  
  105.   node v  = e1->s;
  106.   node w  = e2->t;
  107.  
  108.   if ((v->g!=this) || (w->g!=this)) 
  109.      error_handler(9,"G.new_edge(e,w): e or w not in G");
  110.  
  111.   edge e = new edge_struct(v,w,i);
  112.  
  113.   e->name = ++max_e_index;
  114.   E.append(edge_link(e));
  115.   v->adj_edges[0].insert(adj_link1(e),adj_link1(e1),dir1);
  116.   w->adj_edges[1].insert(adj_link2(e),adj_link1(e2),dir2);
  117.   return e ; 
  118. }
  119.  
  120.  
  121. void graph::del_edge(edge e)
  122. { node v = e->s;
  123.   node w = e->t;
  124.  
  125.   if (v->g != this) error_handler(10,"del_edge: e is not in G");
  126.      
  127.   E.del(edge_link(e));
  128.  
  129.   v->adj_edges[0].del(adj_link1(e));
  130.   w->adj_edges[1].del(adj_link2(e));
  131.  
  132.   if (parent == 0)  // no subgraph
  133.      clear_edge_entry(e->data[0]);
  134.  
  135.   delete e; 
  136. }
  137.  
  138.  
  139. void graph::hide_edge(edge e)
  140. { adj_link1 l1 = adj_link1(e);
  141.   if (l1->succ_link != l1)
  142.   { e->s->adj_edges[0].del(l1);
  143.     e->t->adj_edges[1].del(adj_link2(e));
  144.     l1->succ_link = l1;
  145.    }
  146.  
  147.  }
  148.  
  149. void graph::restore_edge(edge e)
  150. { adj_link1 l1 = adj_link1(e);
  151.   if (l1->succ_link == l1) 
  152.   { e->s->adj_edges[0].append(l1);
  153.     e->t->adj_edges[1].append(adj_link2(e));
  154.    }
  155.  }
  156.  
  157.  
  158. edge graph::rev_edge(edge e)
  159. { node v = e->s;
  160.   node w = e->t;
  161.   if (v->g != this) error_handler(11,"rev_edge: e is not in G");
  162.  
  163.   v->adj_edges[0].del(adj_link1(e));
  164.   w->adj_edges[1].del(adj_link2(e));
  165.  
  166.   w->adj_edges[0].append(adj_link1(e));
  167.   v->adj_edges[1].append(adj_link2(e));
  168.  
  169.   e->s = w;
  170.   e->t = v;
  171.   return e; 
  172. }
  173.  
  174. graph& graph::rev()              
  175. { edge e;
  176.   forall_edges(e,*this) rev_edge(e);
  177.   return *this; 
  178. }
  179.  
  180. void graph::del_all_nodes() { clear(); }
  181.  
  182. void graph::del_all_edges()
  183. { node v;
  184.   forall_nodes(v,*this) 
  185.   { v->adj_edges[0].clear();
  186.     v->adj_edges[1].clear();
  187.    }
  188.   while (!E.empty()) delete edge(edge_link(E.pop()));
  189.   max_e_index = -1;
  190. }
  191.  
  192.